# 爬取当当图书网站中所有关于python关键字的图片信息。要求：将图书图片下载存储指定的目录中，而图书信息写入到数据库中。参考URL：http://search.dangdang.com/?key=python&act=input
# 第九周作业3)
# 班级：Python五期
# 学员：李子坚

# -*- coding: utf-8 -*-
import scrapy
from spiderjob.items import BookItem


class DangdangbookSpider(scrapy.Spider):
    '''爬取当当图书网站中所有关于python关键字的图书信息爬虫类'''

    name = 'dangdangbook'
    allowed_domains = ['www.dangdang.com']
    start_urls = ['http://search.dangdang.com/?key=python&act=input']

    def parse(self, response):
        '''解析当当图书网站中所有关于python关键字的图书信息'''
        
        #输出爬取提示语
        if response.url in self.start_urls:    #第一次提示
            print("正在爬取当当图书网站中所有关于python关键字的图书信息，请稍候……")
        print("正在爬取%s"%(response.url))

        #获取图书搜索信息列表
        book_list = response.css('ul.bigimg li')
        for book in book_list:
            item = BookItem()
            #爬取每本图书信息
            item['title'] = book.xpath("./a/@title").extract_first()    #书名
            item['url'] = book.xpath("./a/@href").extract_first()       #详情页URL
            if book.xpath("./a/img/@data-original"):
                item['pic'] = book.xpath("./a/img/@data-original").extract_first()         #图片URL
            else:
                item['pic'] = book.xpath("./a/img/@src").extract_first()
            keyword = book.xpath("./p[@class='name']/a/@title").extract_first()    #关键词
            item['keyword'] = keyword.replace(item['title'], "", 1)                                #去掉前面的书名
            item['recommend'] = book.xpath("./p[@class='detail']/text()").extract_first()  #推荐
            item['price'] = book.xpath(".//span[@class='search_now_price']")[0].re_first("¥([0-9\.]+)")    #价格
            item['author'] = book.xpath("./p[@class='search_book_author']/span[1]/a/@title").extract_first()                #作者
            item['pubtime'] = book.xpath("./p[@class='search_book_author']/span[2]")[0].re_first("<span>[\s]*/(.*?)</span>")#出版时间
            item['publisher'] = book.xpath("./p[@class='search_book_author']/span[3]/a/@title").extract_first()             #出版社
            item['score'] = book.xpath("./p[@class='search_star_line']/span[@class='search_star_black']/span")[0].re_first("width: ([0-9\.]+)%;")    #评分
            
            #print(item)
            yield item
                        
        #获取图书搜索结果下一页节点
        next = response.css("li.next")[0]
        #判断若不是最后一页
        if next.re('<li class=\"next none\">(.*?)</li>'):
        	print("当当图书网站中所有关于python关键字的图书信息爬取完成，请查看数据库<dangdangdb>的数据表格<book>和子文件夹<images>")
        else:
            #提取下一页图书搜索结果的URL
            next_url = next.xpath("./a/@href").extract_first()
            fullurl = "http://search.dangdang.com" + next_url
            fullurl = response.urljoin(fullurl)

            #构造下一页图书信息的爬取
            yield scrapy.Request(url=fullurl, callback=self.parse, dont_filter=True)

